有這幾個函數:
void free_all_register_address(void); // 釋放
void register_address(void *address); // 標記
void new_1d(void **ptr, int length, int type_side); // 分配
分別進行釋放、標記、分配的工作。
還有用於紀錄地址的全域變數:
void **address_pool = NULL; //將會是一個動態陣列,儲存 void*
int index = 0; //索引,指向目前可以儲存地址的空間
標記和分配在前兩篇文章已經進行了初步的構思完善,
詳細的部分可以回去看。
所以今天要完善的是用於釋放所有被標記地址的函數,
即 free_all_register_address
。
假設所有需要釋放的地址已經經 register_address()
函數註冊、標記,
所以要釋放所有被標記地址只需要遍歷一次 address_pool
。
void free_all_register_address(void) {
/*遍歷 address_pool 的空間*/
for (int i = 0; i < index; i++) {
free(address_pool[i]); //釋放曾經記錄過的記憶體地址的空間
address_pool[i] = NULL;
}
/*釋放用於紀錄的空間*/
free(address_pool);
address_pool = NULL;
}
很簡單,兩個部分,
就是遍歷 address_pool
,釋放。
再釋放用於記錄的空間。
釋放後設為 NULL 是為了安全,原因不多說。